package com.itheima.a03polymorphismdemo03;


/***
 *@title Test
 *@description <TODO description class purpose>
 *@author 12468
 *@version 1.0.0
 *@create 2024/10/23 23:46
 **/
public class Test {
    public static void main(String[] args) {
        // 使用多态创建对象
        Animal a = new Dog();
        // 编译看左右，运行看右边
        a.eat();

        /*
            多态的弊端：
                不能调用子类特有的功能
                报错的原因：
                    当调用成员方法的时候，编译看左右，运行看右边
                    那么编译的时候会检查左边父类有没有这个方法，如果没有直接报错
         */
        // a.lookHome();

        /*
            解决方法：
                使用强转变回右边的对象
         */
        // Dog d = (Dog) a;
        // d.lookHome();

        /*
            转换类型的时候要注意类型，不能瞎转，如果转成其他类型就会报错
         */
        // Cat c = (Cat) a;
        // c.catchMouse(); // java.lang.ClassCastException 错误

        /*
            可以通过 instanceof 方法判断是不是后面的类型
         */
        // if(a instanceof Dog) {
        //     Dog d = (Dog) a;
        //     d.lookHome();
        // } else if(a instanceof Cat) {
        //     Cat c = (Cat) a;
        //     c.catchMouse();
        // }

        /**
         * jdk14 优化的写法：
         */
        if(a instanceof Dog d) {
            d.lookHome();
        } else if(a instanceof Cat c) {
            c.catchMouse();
        }
    }
}

class Animal {
    public void eat() {
        System.out.println("动物在吃食物");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗在吃骨头");
    }

    public void lookHome() {
        System.out.println("狗在看家");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫在吃鱼");
    }

    public void catchMouse() {
        System.out.println("猫在抓老鼠");
    }
}
